/**
 * 年度确认相关工具函数
 */

import { ElMessage } from 'element-plus'
import { getConfigKey } from '@/api/system/config'

// 配置键名常量
export const YEARLY_CONFIRM_CONFIG_KEYS = {
	START_TIME: 'yearly_confirm_start_time',
	END_TIME: 'yearly_confirm_end_time'
} as const

/**
 * 年度确认时间配置接口
 */
export interface YearlyConfirmTimeConfig {
	startTime: string
	endTime: string
}

/**
 * 获取年度确认时间配置
 */
export const getYearlyConfirmTimeConfig = async (): Promise<YearlyConfirmTimeConfig | null> => {
	try {
		const [startTimeRes, endTimeRes] = await Promise.all([
			getConfigKey(YEARLY_CONFIRM_CONFIG_KEYS.START_TIME),
			getConfigKey(YEARLY_CONFIRM_CONFIG_KEYS.END_TIME)
		])

		const startTime = String(startTimeRes?.data || '')
		const endTime = String(endTimeRes?.data || '')

		if (!startTime || !endTime) {
			return null
		}

		return {
			startTime,
			endTime
		}
	} catch (error) {
		console.error('获取年度确认时间配置失败:', error)
		return null
	}
}

/**
 * 检查是否在年度确认时间段内
 */
export const isInYearlyConfirmPeriod = (config: YearlyConfirmTimeConfig): boolean => {
	if (!config.startTime || !config.endTime) {
		return false
	}

	const now = new Date()
	const start = new Date(config.startTime)
	const end = new Date(config.endTime)

	return now >= start && now <= end
}

/**
 * 检查并提示年度确认时间状态
 * @param showMessage 是否显示消息提示，默认为true
 * @returns 是否在有效时间段内
 */
export const checkYearlyConfirmPeriod = async (showMessage = true): Promise<boolean> => {
	try {
		const config = await getYearlyConfirmTimeConfig()

		if (!config) {
			if (showMessage) {
				ElMessage.error('未设置年度确认时间配置')
			}
			return false
		}

		const isInPeriod = isInYearlyConfirmPeriod(config)

		if (showMessage) {
			if (isInPeriod) {
				ElMessage.success('当前处于年度确认时间段内，可以发出确认邀请')
			} else {
				ElMessage.warning('当前时段无法进行年度确认邀请')
			}
		}

		return isInPeriod
	} catch (error) {
		console.error('检查年度确认时间状态失败:', error)
		if (showMessage) {
			ElMessage.error('检查年度确认时间状态失败')
		}
		return false
	}
}

/**
 * 验证年度确认操作权限
 * 如果不在时间段内，会显示错误提示并返回false
 */
export const validateYearlyConfirmPermission = async (): Promise<boolean> => {
	const config = await getYearlyConfirmTimeConfig()

	if (!config) {
		ElMessage.error('未设置年度确认时间配置，请联系管理员')
		return false
	}

	const isInPeriod = isInYearlyConfirmPeriod(config)

	if (!isInPeriod) {
		ElMessage.error('当前时段无法进行年度确认邀请')
		return false
	}

	return true
}
